/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package agentes09.gestor.behaviours;

import agentes09.gestor.AgenteGestor;
import agentes09.gestor.SituacionJuego;
import jade.core.AID;
import jade.core.Agent;
import jade.core.behaviours.TickerBehaviour;
import jade.domain.DFService;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAException;
import jade.lang.acl.ACLMessage;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author jmcarmona
 */
public class EventoDeControl extends TickerBehaviour {

    public EventoDeControl(Agent a, long period) {
        super(a, period);
    }

    @Override
    protected void onTick() {
        AgenteGestor gestor = (AgenteGestor) myAgent;
        //Imprimimos la situacion hasta ahora...
        gestor.imprimirSituacion();
        //...y creamos una nueva, a rellenar
        gestor.setSituacionJuegoActual(new SituacionJuego(gestor.getTiempoActual()));
        try {
            actualizarAgentesRegistrados();
            consultarDatosAgentes();
        } catch (IOException ex) {
            Logger.getLogger(EventoDeControl.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FIPAException ex) {
            Logger.getLogger(EventoDeControl.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    /**
     * //TODO: refactorizar
     * @throws jade.domain.FIPAException
     */
    private void actualizarAgentesRegistrados() throws FIPAException {
        AgenteGestor gestor = (AgenteGestor) myAgent;
        gestor.reiniciarAgentesRegistrados();

        actualizarAgentesRegistradosTipo("camion");
        actualizarAgentesRegistradosTipo("consumidor");
        actualizarAgentesRegistradosTipo("productor");
        actualizarAgentesRegistradosTipo("gasolinera");
    }

    private void actualizarAgentesRegistradosTipo(String tipo) throws FIPAException {
        AgenteGestor gestor = (AgenteGestor) myAgent;

        DFAgentDescription dfd = new DFAgentDescription();
        ServiceDescription sd = new ServiceDescription();
        sd.setType(tipo);
        dfd.addServices(sd);

        DFAgentDescription[] result = DFService.search(gestor, dfd);
        for (DFAgentDescription agente : result) {
            gestor.getAgentesRegistrados().add(agente.getName());
        }
    }

    /**
     * Esta funcion le envia un mensaje a cada agente, para preguntarle por sus datos.
     * El contenido del mensaje es la hora actual de simulacion
     * (dinero, situacion, ...)
     * @param agente
     */
    private void consultarDatosAgentes() throws IOException {
		System.out.println("Consultando datos agentes");
        AgenteGestor gestor = (AgenteGestor) myAgent;
        ACLMessage mensaje = new ACLMessage(ACLMessage.CFP);
        mensaje.setConversationId("preguntar-estado");
        mensaje.setContentObject(gestor.getTiempoActual());
        for (AID agente : gestor.getAgentesRegistrados()) {
			System.out.println("...consultando datos de " + agente.getName());
            mensaje.addReceiver(agente);
        }
        myAgent.send(mensaje);
    }
}
